/*
 * Label.java
 *
 * Created on 12 de Mar�o de 2003, 22:42
 */
package saci.reptil;

import javax.swing.JLabel;
import javax.swing.ImageIcon;

import java.awt.Color;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * Classe que representa um <i>Label</i> no relat�rio
 *
 * @author  saci
 */
public class Label extends JLabel {

    final static long serialVersionUID = 14236775475312080L;
    private java.awt.Font pdfFont;
    /**
     * Fun��o que retorna data e hora
     */
    public static final int NOW = 1;
    /**
     * Fun��o que retorna a data
     */
    public static final int DATE = 2;
    /**
     * Fun��o que retorna a hora
     */
    public static final int TIME = 3;
    /**
     * Fun��o que retorna o n�mero da p�gina
     */
    public static final int PAGE_NUMBER = 4;
    /**
     * Fun��o que retorna o n�mero de p�ginas
     */
    public static final int NUMBER_OF_PAGES = 5;
    /**
     * Fun��o que retorna a posi��o atual no banco de dados
     */
    public static final int DATABASE_POSITION = 6;
    private Object constraint;
    private int function;
    private Class oClass;
    private Object oObject;
    private String oMethod;
    private Class[] mClass;

    /**
     * Cria uma nova inst�ncia da classe
     */
    public Label() {
        super();
        setBackground(Color.white);
    }

    /**
     * Cria uma nova inst�ncia da classe
     *
     * @param text o texto a ser exibido
     */
    public Label(String text) {
        super(text);
        setBackground(Color.white);
    }

    /**
     * Cria uma nova inst�ncia da classe
     *
     * @param text o texto a ser exibido
     * @param alignment o alinhamento a ser utilizado
     */
    public Label(String text, int alignment) {
        super(text, alignment);
        setBackground(Color.white);
    }

    /**
     * Cria uma nova inst�ncia da classe
     *
     * @param i a imagem a ser desenhada
     */
    public Label(ImageIcon i) {
        super(i);
        setBackground(Color.white);
    }

    /**
     * Cria uma nova inst�ncia da classe
     *
     * @param i a imagem a ser desenhada
     * @param alignment o alinhamento a ser utilizado
     */
    public Label(ImageIcon i, int alignment) {
        super(i, alignment);
        setBackground(Color.white);
    }

    /**
     * Altera a fun��o do label
     *
     * @param function o c�digo da nova fun��o
     */
    public void setFunction(int function) {
        this.function = function;
    }

    /**
     * Retorna o c�digo da fun��o do label
     */
    public int getFunction() {
        return function;
    }

    /**
     * Altera outras fun��es atribu�das ao label
     *
     * @param c o nome da classe que cont�m a fun��o que ser� executada
     * @param i a inicializa��o da classe
     * @param m o nome do m�todo que retorne uma String
     */
    public void setOtherFunction(String c, String i, String m) {
        try {
            if (i != null) {
                Object o = Class.forName(c).getField(i).get(null);

                Class cl;

                if (o instanceof Integer) {
                    cl = int.class;
                } else if (o instanceof Boolean) {
                    cl = boolean.class;
                } else if (o instanceof Double) {
                    cl = double.class;
                } else if (o instanceof Float) {
                    cl = float.class;
                } else if (o instanceof Byte) {
                    cl = byte.class;
                } else if (o instanceof Character) {
                    cl = char.class;
                } else {
                    cl = o.getClass();
                }

                Constructor constructor = Class.forName(c).getConstructor(new Class[]{cl});

                oObject = constructor.newInstance(new Object[]{o});
            } else {
                oObject = Class.forName(c).newInstance();
            }

            oClass = Class.forName(c);
            oMethod = m;
            mClass = new Class[]{String.class};
        } catch (Exception e) {
            throw new RuntimeException(e.toString());
        }
    }

    /**
     * Executa outras fun��es atribu�das ao label
     *
     * @return String o retorno da fun��o
     */
    public String executeOtherFunction() {
        try {
            if (oClass != null && oMethod != null && oObject != null) {
                Method m = oClass.getMethod(oMethod, mClass);
                Object o = m.invoke(oObject, new Object[]{getText()});
                return o != null ? o.toString() : null;
            }

            return null;
        } catch (Exception e) {
            throw new RuntimeException(e.toString());
        }
    }

    /**
     * Altera a constraint que ser� utilizada pelo layout
     */
    public void setConstraint(Object constraint) {
        this.constraint = constraint;
    }

    /**
     * Retorna a constraint que ser� utilizada pelo layout
     */
    public Object getConstraint() {
        return constraint;
    }

    public void setPDFFont(java.awt.Font font) {
        pdfFont = font;
    }

    public java.awt.Font getPDFFont() {
        return pdfFont == null ? getFont() : pdfFont;
    }
}
